查看原文
其他

流式和离线语音场景下VAD语音端点检测算法实践

李咏泽 58技术 2023-12-21

导读

近年来,AI智能语音应用在58同城广泛落地。无论是智能语音交互平台还是“灵犀”智能语音分析平台,都需要对电话语音进行处理分析,服务上层应用。如果把音频信号比作水流,语音端点检测(VAD, Voice Activity Detection)就是控制水流的阀门,其结果决定了系统的后续动作。

本文主要讲述了58自研的VAD系统在流式、离线两大场景中的实践过程,第一部分简单介绍这两大场景,第二部分是对VAD算法的一个概述,第三、第四部分分别描述了流式、离线场景中遇到的不同问题以及解决方案,第五部分是评测结果,第六、第七部分是总结和参考文献。


背景介绍

语音端点检测(以下简称VAD)是语音处理中重要的模块之一,它负责检测出整段音频中人声的出现以及消失。在我们的系统中,VAD作为语音识别(automatic speech recognition)和说话人角色分离(speaker diarization)的前置模块,找到整段音频中每句话的开始点和结束点提供给后方模块继续处理。一个性能出色的VAD系统,能够尽可能多的去掉非人声段且尽可能完整的保留人声段,既避免了过多非人声片段流入后方模块带来的误识别和资源消耗问题,又避免了过度裁剪导致的语音信息丢失问题。
VAD系统在58同城的应用可分为流式和离线两个场景,一是实时人机语音通话 ,属于流式场景,我们的语音机器人具有多轮语音交互功能并应用于自动电话销售、产品服务推广、信息审核等业务。实时通信的音频信号流会源源不断的发送到VAD模块,VAD系统需要判断出当前通话所处的状态:人声片段的开始、持续、结束。如果检测到语音片段的开始,系统会将该时刻起的音频信号持续发到语音识别模块进行内容识别直到检测到语音片段的结束,VAD系统提供的状态和语音识别的内容都会对机器人接下来的动作产生影响。该场景的主要挑战在于工程化:(1)由于声学特征计算分帧的特殊性,调用VAD服务时不但需要发送当前时刻的音频数据,还需要携带上次发送的音频末数据,来保证声学特征的连续性,因此需要计算末尾数据起始点。(2)需要保证每次调用VAD服务的低耗时。(3)需要保证VAD模型能获取之前请求的上下文内容。
图一: vad流式场景示意图
第二大场景是离线场景,应用于TEG AI Lab自研的“灵犀”智能语音分析平台,该平台利用AI Lab自研语音识别引擎将语音转化成文本,然后基于NLP技术从文本中挖掘各类标签以服务上层应用。该场景下,VAD系统收到的是完整的音频,输出的是整条音频中每个句子的起点和终点时间戳。时间戳会被后端的说话人角色分离以及语音识别模块用来进行进一步处理。在离线场景下,为了保证处理速度,要使用批处理,进一步把音频分块,该场景的挑战在于分块后上下文信息减少导致的VAD准确率下降。
图二:vad离线场景示意图

VAD算法概述


图三:VAD系统流程总览
通常来说,一个VAD系统会有判决和后处理两个模块,判决模块(decision module)来对一帧信号是否属于人声进行判断并打上标签,后处理模块(post-processing module)来对前面的帧级标签序列进行平滑处理,因为判决模块可能会输出不够连续、比较尖锐的标签序列,需要用平滑处理来处理掉。
判决模块的输入为声学特征,输出为该声学特征的分类结果,通常来说为两分类,语音和非语音。判决模块的做法很丰富,简单一点的是通过一些信号处理统计指标来判断,例如能量[1]、过零率[2]等。这类方法简单,但是鲁棒性不足,尤其是在复杂声学场景下性能不佳。模型判决的鲁棒性相对较好,传统模型有GMM[3],SVM[4]等,由于深度学习的蓬勃发展,神经网络模型[5][6]也是非常适合这种分类问题。因为神经网络的模型容量更大,学习能力更强,在数据量足够多的情况下分类效果比传统模型要更好。由于我们有足够的业务数据用来训练,所以直接选择神经网络模型。当前使用神经网络模型来做VAD的方案也很多,例如用DNN[5][6]、CNN[7][8]、LSTM[9]、甚至互相的结合例如CNN+LSTM[10],还有加入self-attention以及感受野可自动变换的网络[11]。网络结构纷繁复杂,总结来说参数量越多、结构设计越精妙、网络看到的上下文越多,分类的准确率就越高。实际落地时,我们在模型选择上更多的是考虑让VAD系统在保持准确率的同时,具有更低的预测耗时和计算量,尽可能占用少的计算资源,同时考虑到这是一个序列标签问题,需要模型看到尽可能多的上下文,因此离线场景和流式场景方案均采用了双层LSTM+双层全连接网络,LSTM隐层状态为64维,全连接网络为32维,最终的输出层维度为2维(“人声“和“非人声”二分类问题)。
后处理模块主要是进行平滑操作,因为判决模块输出的标签序列可能存在不连续有毛刺的现象,如图三中的示例,可能是模型捕捉到了说话间细微的停顿,也有可能是判决模块本身判断的异常,我们需要做一定程度的平滑来尽可能保证句子的完整性。平滑的策略也有很多,可以根据自己的实际需求来进行设计,我们采用的平滑策略是使用一个长度为N的平滑窗,如果窗内有T1数量的标签为人声,就认为是句子的开始,当窗内有T2数量的标签为非人声时,就认为是句子的结束。{N,T1,T2}的选择会一定程度上影响语音片段的连贯性,下面的例子,当取值分别为{5,4,5}时,可以看到原本的一个句子会被分成两个片段(图四-a),但是当取值分别为{15,10,15}时,保留了完整的一句而非多个片段(图四-b)。根据不同的场景,我们也使用了不同的值,例如在我们的神奇面试间(虚拟AI面试官对面试人进行面试)场景下,面试者需要边想边回答问题,那么语速相对较慢,停顿较多,那么我们就用更长的窗以及更严格的结束阈值去尽可能的让句子更完整,我们的经验参数是{15,10,15}。在呼叫中心的电话销售、客服场景下,两个人更多的是口语化的交流,相比较语速更快,停顿更少,需要用较短的窗去保证VAD系统的灵敏性,我们的经验参数是{10,8,10}。

(a)滑动窗参数{5,4,5}
(b)滑动窗参数{15,10,15}
图四:不同平滑窗对语音片段的影响

流式场景VAD实践

1.概述

根据前面的背景介绍,流式场景下,模型在当前时刻无法看到未来的数据,只能看到前面的数据,我们使用单向LSTM的设计正好契合这一点,不需要后面的信息,只需要历史信息,我们的判决模块设计如下图所示,首先输入是一定长度的声学信号,然后将这些采样点计算成声学特征序列,将声学特征序列逐帧输入模型,得到等序列长度的标签序列。

图五:VAD判决模块
从服务的角度看,我们的系统设计如下,我们的神经网络模型服务部署在58自研的深度学习平台wpai上,服务的输入为一定数量的采样点,输出为该采样点对应的标签序列。人机对话系统作为服务的调用方,会声明一个VAD类的对象,该对象负责接收音频采样点,发送音频采样点请求wpai上部署的服务,收到发回来的标签序列后,进行平滑处理,再来告诉人机对话系统当前对话所处的状态,即是句子开始、结束、持续还是无人应答等。
图六:流式场景调用关系框图

2.模型的训练和导出

当前业务中,使用流式VAD的业务场景有两个,一个是语音机器人,一个是神奇面试间。语音机器人为8k的电话信道,神奇面试间是在app端的16k数据。为了避免信道失配问题(domain mismatch),这两个业务场景选用各自的数据来训练各自的网络模型。解决信道失配问题的最好方法就是让模型见过这类数据,因此还可以选择把两个业务场景的训练数据混合起来训练一个模型,但我们考虑到训练的网络模型参数量本身比较小,学习能力有限,可能很难同时学到这么多数据分布,遂没有采用一起训练的方案。语音机器人业务场景的模型我们使用信道相似的呼叫中心数据(也为电话信道8k数据),训练数据量为520小时。神奇面试间业务场景的模型我们使用线上真实业务数据,训练数据量为440小时。
为了提高训练速度,训练前把训练样本提前写成tfr格式。训练样本的输入是把每一条音频计算成的声学特征序列,我们这里采用的是40维的mfcc特征,每一帧的长度为25ms,帧移为10ms。训练样本的标签是根据该音频在语音标注系统标注得到的时间戳,结合特征向量每一帧的时间,组织成和输入特征向量帧数相同的标签序列。
模型训练时,每个iteration会读取batch_size条音频,对于每一条训练样本,把特征向量序列从第一帧到最后一帧依次输入模型(LSTM+FC),得到与模型输入帧数相等的输出标签。对于模型来说,当前时刻是可以感知到之前所有时刻的信息的,这样可以提高模型的分类准确率。模型训练的损失函数为交叉熵损失函数,训练epoch为20。
在概述部分我们提到,神经网络模型是部署在wpai上的,因为是流式VAD,神经网络模型服务每次收到的信号只有当前时段的语音包(约100ms),无法知道历史信息。这就和训练的时候的情况完全不同,训练时模型对信号是从开头扫到结束,每一步都知道历史信息。为了记忆历史信息,在请求神经网络模型服务时,需要携带上一时刻VAD服务返回的LSTM隐层状态,同样的,神经网络服务在完成推理后,需要把最后一步的LSTM隐层状态数据同步发送给调用方,以便于下次调用服务的历史信息记忆。基于上面的设计,我们在模型导出时,需要把LSTM的隐层状态作为一个输入,每次调用时都需要给他赋值,这样就完成了历史信息的记忆。

3.VAD调用端设计细节

对一次通话,需要用一个VAD对象来完成一下任务:存储线上实时发来的音频流数据、请求神经网络服务、接收并存储标签序列、标签序列平滑后处理、向对话系统给出当前时刻对话所处的状态(句子的开始、持续、结束)。
线上每次会发来一个大小为640字节的包,对应到音频长度就是20ms,我们使用一个数组来依次存储这些采样点。在请求神经网络服务时,并不是VAD对象每次收到一个数据包就去请求,而是每收到五个数据包再去请求神经网络服务。原因如下:1.模型计算声学特征至少需要25ms的数据,因此一个数据包无法得到结果;2.单次发送五个包并收到结果的耗时低于分五次逐个发送五个包并收到结果的耗时。
每次攒够五个数据包之后请求神经网络服务时,有三个细节点,一是为了降低发送耗时,我们发送的是byte数据类型,在服务端再将byte转为float,而非先转为float,再把float类型发给服务;二是前面提到的历史信息问题,VAD对象中会有一个数组来存储上次请求后LSTM的最后步状态,在本次请求时,会把这个状态数据和五个数据包一起发送到服务,同样的,服务会返回数据包对应的标签序列和LSTM最后一步状态给VAD对象,我们再把这个状态数据更新以便于下次请求;三是最复杂的地方,每次发送的数据包并不仅仅是当前的五个数据包的数据点,而且要在这五个数据包前再加一些历史采样点,核心原因是声学特征的计算特殊性,在分帧时帧和帧之间存在重叠,即复用采样点的情况,而且在上一次请求的数据包中,计算声学特征时还可能会丢掉后面的一部分采样点,所以每次需要记下下次要复用的采样点,在下一次请求时,把这些点一并发送过去。例如图七中给出的例子,后面的红色点部分,就是下次请求需要一并发过去的点。

图七:复用采样点计算
VAD对象内有二个状态量,来向系统告知当前对话的状态,一个是是否检测到句子开头,第二个是句子是否还在持续中。这两个状态量的更新是根据平滑后处理的结果决定的。VAD对象每次收到服务返回的十个左右的标签后,会将这些标签序列依次加入标签序列数组,这个数组专门用来存储历史标签序列,每加入一个标签后,会用第二部分描述的滑动窗平滑算法来判断句子是否开始或结束,依此来达到流式判断。

离线场景VAD实践

1.概述

根据前面的背景介绍,离线的VAD是处理已经存储好的录音文件,对于离线场景来说,一条通话录音时长平均在一分钟左右,我们的模型是LSTM+FC,如果用LSTM把录音从头扫到尾,这样处理速度就很慢了,因此我们需要成批量的处理音频,需要把音频切成等长的部分放在同一个batch内,用神经网络并行预测得到每个音频段的标签后,再重新拼成标签序列,最终经过平滑后处理得到语音片段的起始和结束点。

2.模型训练

如同前文所述,我们离线采用的策略是批处理,把一次要处理的音频都切成等长的段落。对于任何一条音频而言,批处理意味着模型无法获得整段音频的信息。打比方说,某条时长100秒的音频,我们的批处理是将其切成5秒的小片段,对于每个小段的开头,模型知道的历史信息为0,每个小段的结尾模型知道的历史信息也就不超过5秒。如果不进行批处理,模型任意时刻可以知道该时刻前所有的历史信息。我们训练模型时,如果沿用流式场景的训练方式,那么使用上述批处理预测方法会使准确率大打折扣。
综上我们在训练时,就要刻意提升模型对于较少历史信息、较短音频片段的分类能力,因此在构造训练样本时,和流式场景训练时需要有一些不同,我们的单个训练样本不再是整条音频为单位了,而是把整条音频的训练样本打碎为时长为3秒-10秒之间的随机长度。同时为了提高在GPU上的推理性能,我们在用tensorflow训练时,没有使用tf.contrib.rnn.LSTMCell接口构造lstm单元而是使用了tf.contrib.cudnn_rnn.CudnnCompatibleLSTMCell,处理耗时降低34.6%。

3.实践中的前文信息处理

这里同样还是讨论实际批处理时,历史信息太少导致的效果下降问题。我们发现即使在模型训练时使用了不等长切分后的样本,效果仍然不及流式的那种看到所有历史信息的模式。因此,采用了折中的方案,即在批处理切分音频时,让每一段音频都携带一些前文,如下图所示。当拿到标签序列后,这些前文对应的标签我们需要丢弃掉,再把每段的标签拼接成完整的标签序列。那么把音频切成多长的块,以及每块带多少秒的前文信息这里需要通过实验进一步确定,我们实验了三种组合,最终选择了5-1的组合,即把整条音频统一切为5秒的片段,每个片段带1秒的历史信息。

图八-如何携带历史信息分片

VAD效果评测

前面提到的流式业务场景,均为双声道录音,离线业务场景则单双声道均有。单声道音频中主叫和被叫两个说话人语音在同一个声道中,因此处理链路为:VAD+说话人角色分离+语音识别,双声道音频中两个主说话人有各自的声道,因此数据处理链路为:VAD+语音识别,无需做说话人角色分离。鉴于链路的不同,我们在评测VAD效果时分为单声道和双声道两个场景来评测,而非离线和流式。

评测的指标有三种,第一种是VAD对人声的false alarm rate(非人声被误判为人声比率)和miss alarm rate(人声被误判为非人声的比率)。第二种是说话人角色分离错误(der, Diarization Error Rate)用来评估VAD对说话人角色分离模块的影响,它由false alarm rate,miss alarm rate和说话人分类错误(把角色A误认为B或者把角色B误认为A)构成。第三种指标是字错率(cer, Character Error Rate)用来评估VAD对语音识别模块的影响。与我们VAD系统作对比的是webrtcVAD。

表一

表二
由表一可知,在单声道场景中,自研VAD的各项指标均优于webrtcVAD。由表二可知,在双声道场景中,自研VAD大大降低了非人声段被判定为人声的情况(即false alarm rate大大降低),因此更少的无效音频进入语音识别,减少了语音识别服务的负担,同时对语音识别效果的影响微乎其微,cer的微弱上升是由于自研VAD的miss alarm rate略高导致的。

总结

本文以流式和离线场景的实践角度,介绍了自研VAD系统从模型训练到实际应用过程中遇到的问题以及解决方案。随着AI智能语音在58的更广泛落地,以后VAD遇到的声学场景会更加复杂,未来我们在VAD上还会进行如下方向的工作:1.低信噪比、存在混响的复杂声学场景如何准确进行语音端点检测;2.VAD模型通用化,VAD模型能够在未见过的场景下保持较高准确率,或者是探索一种好的领域自适应方法(domain adaptation),能够用少量的无监督或有监督的新场景数据达到好的性能;3.根据VAD系统后接的不同模块,例如说话人角色分离或者是语音识别等,探索不同的联合优化策略,让VAD更好的服务后续模块。

作者简介:
作者:李咏泽,58同城TEG-技术工程平台群-AI Lab算法高级工程师

有奖互动

Perseverance Prevails

欢迎在评论区为作者大佬打call,将抽取点赞前五名送出58帮帮手机支架一个。

开奖时间:6月1日18:00


参考文献

[1]Kyoung Ho Woo, Tae Young Yang, Kun Jung Park, and Chungyong Lee, “Robust voice activity detection algorithm for estimating noise spectrum,”

[2]Jean Claude Junqua, Ben Reaves, and Brian Mak, A study of endpoint detection algorithms in adverse conditions: incidence on a DTW and HMM recognizer,” 


[3]Tim Ng, Bing Zhang, Long Nguyen, Spyros Matsoukas, Xin hui Zhou, Nima Mesgarani, Karel Vesely`, and Pavel Matejka, “Developing a speech activity detection system for the DARPA RATS program,”

[4]Nima Mesgarani, Malcolm Slaney, and Shihab A Shamma, “Discrimination of speech from nonspeech based on multiscale spectro-temporal modulations,” 


[5]Neville Ryant, Mark Liberman, and Jiahong Yuan, “Speech activity detection on YouTube using deep neural networks,” 

[6]Xiao-LeiZhangandJiWu,“Deepbeliefnetworksbasedvoiceactivitydetection,”

[7]Samuel Thomas, Sriram Ganapathy, George Saon, and Hagen Soltau, “Analyzing convolutional neural networks for speech activity detection in mismatched acoustic conditions,”

[8]George Saon, Samuel Thomas, Hagen Soltau, Sriram Ganapa- thy, and Brian Kingsbury, “The IBM speech activity detection system for the DARPA RATS program,”

[9]Florian Eyben, Felix Weninger, Stefano Squartini, and Bjo ̈rn Schuller, “Real-life voice activity detection with LSTM recur- rent neural networks and an application to hollywood movies,” 
[10]Johannes Wagner, Dominik Schiller, Andreas Seiderer, Elisabeth André,”Deep Learning in Paralinguistic Recognition Tasks: Are Hand-crafted Features Still Relevant?”
[11]Zhenpeng Zheng, Jianzong Wang, Ning Cheng, Jian Luo, Jing Xiao: MLNET: An Adaptive Multiple Receptive-Field Attention Neural Network for Voice Activity Detection. INTERSPEECH 2020: 3695-3699

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存